package fr.upstlse.glre.client.administration.utilisateurs.action;

import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.user.client.rpc.AsyncCallback;

import fr.upstlse.glre.client.RfgConstante;
import fr.upstlse.glre.client.administration.utilisateurs.ModificationPanel;
import fr.upstlse.glre.client.administration.utilisateurs.ModificationWindow;
import fr.upstlse.glre.client.utilitaires.ControlerUtil;
import fr.upstlse.glre.client.vo.user.AdresseVOGWT;
import fr.upstlse.glre.client.vo.user.EtudiantVOGWT;
import fr.upstlse.glre.client.vo.user.ProfesseurVOGWT;
import fr.upstlse.glre.client.vo.user.UserRoleVOGWT;
import fr.upstlse.glre.client.vo.user.UserVOGWT;
import fr.upstlse.glre.client.widgets.fields.EtudiantFields;
import fr.upstlse.glre.client.widgets.fields.IUserFields;
import fr.upstlse.glre.client.widgets.fields.ProfesseurFields;
import fr.upstlse.glre.client.widgets.fields.UserFields;

public class ModifyUserAction extends SelectionListener<ComponentEvent> {

	IUserFields userFields;
	ModificationPanel modificationPanel;

	public ModifyUserAction(IUserFields userFields) {
		super();
		this.userFields = userFields;
		modificationPanel = ModificationPanel.getInstance();
	}

	public void componentSelected(ComponentEvent ce) {
		if (userFields instanceof UserFields) {
			modifyAdmin((UserFields) userFields);
		} else if (userFields instanceof EtudiantFields) {
			modifyEtudiant((EtudiantFields) userFields);
		} else if (userFields instanceof ProfesseurFields) {
			modifyProfesseur((ProfesseurFields) userFields);
		} else {
			MessageBox.alert("Erreur", "Role non pris en charge", null);
		}
	}

	private void modifyAdmin(UserFields pUserFields) {
		UserVOGWT lUserVOGWT = new UserVOGWT();
		lUserVOGWT.setId(new Long(pUserFields.getId().getValue()));
		lUserVOGWT.setLogin((String) pUserFields.getLogin().getValue());
		lUserVOGWT.setPassword((String) pUserFields.getMotDePasse().getValue());
		lUserVOGWT.setRole((String)pUserFields.getRole().getValue().get(RfgConstante.ROLE_MODELDATA_ROLE));

		final MessageBox lWaitMessageBox = MessageBox.progress("Information",
				"Modification de l'administrateur" + lUserVOGWT.getLogin(),
				"modification en cours...");
		AsyncCallback<Object> lCallback = new AsyncCallback<Object>() {
			public void onFailure(Throwable pCaught) {
				lWaitMessageBox.hide();
				MessageBox.alert("Erreur UpdateUser ", pCaught.getMessage(),
						null);
			}

			public void onSuccess(Object pResult) {
				lWaitMessageBox.hide();
				Info.display("Information",
						"Administrateur modifié avec succès", "");
				ModificationWindow.closeCurrentWindow();
			}
		};
		ControlerUtil.getUserControlerServiceAsyncInstance().updateUser(
				lUserVOGWT, lCallback);
	}

	private void modifyEtudiant(EtudiantFields pEtudiantFields) {
		AdresseVOGWT lAdresse = new AdresseVOGWT();
		lAdresse.setId(new Long(pEtudiantFields.getAdresseId().getValue())
				.longValue());
		lAdresse.setVoie((String) pEtudiantFields.getAdresseVoie().getValue());
		lAdresse.setCodepostal((String) pEtudiantFields.getAdresseCodePostal()
				.getValue());
		lAdresse
				.setVille((String) pEtudiantFields.getAdresseVille().getValue());
		lAdresse.setPays((String) pEtudiantFields.getAdressePays().getValue());

		EtudiantVOGWT lEtudiantVOGWT = new EtudiantVOGWT();
		lEtudiantVOGWT.setId(new Long(pEtudiantFields.getId().getValue())
				.longValue());
		lEtudiantVOGWT.setNom((String) pEtudiantFields.getNom().getValue());
		lEtudiantVOGWT.setPrenom((String) pEtudiantFields.getPrenom()
				.getValue());
		lEtudiantVOGWT.setEmail((String) pEtudiantFields.getEmail().getValue());
		lEtudiantVOGWT.setTelephonefixe((String) pEtudiantFields
				.getTelephoneFixe().getValue());
		lEtudiantVOGWT.setTelephoneportable((String) pEtudiantFields
				.getTelephonePortable().getValue());
		lEtudiantVOGWT.setLogin((String) pEtudiantFields.getLogin().getValue());
		lEtudiantVOGWT.setPassword((String) pEtudiantFields.getMotdepasse()
				.getValue());
		lEtudiantVOGWT.setRole(UserRoleVOGWT.ETUDIANT.getValue());
		lEtudiantVOGWT.setAdresse(lAdresse);

		final MessageBox lWaitMessageBox = MessageBox.wait("Information",
				"Modification de l'étudiant " + lEtudiantVOGWT.getLogin(),
				"modification en cours...");
		AsyncCallback<Object> lCallback = new AsyncCallback<Object>() {
			public void onFailure(Throwable pCaught) {
				lWaitMessageBox.hide();
				MessageBox.alert("Erreur updateEtudiant", pCaught.getMessage(),
						null);
			}

			public void onSuccess(Object pResult) {
				lWaitMessageBox.hide();
				Info.display("Information", "Étudiant modifié avec succès", "");
				ModificationWindow.closeCurrentWindow();
			}
		};
		ControlerUtil.getUserControlerServiceAsyncInstance().updateEtudiant(
				lEtudiantVOGWT, lCallback);
	}

	private void modifyProfesseur(ProfesseurFields pProfesseurFields) {
		ProfesseurVOGWT lProfesseurVOGWT = new ProfesseurVOGWT();
		lProfesseurVOGWT.setNom((String) pProfesseurFields.getNom().getValue());
		lProfesseurVOGWT.setPrenom((String) pProfesseurFields.getPrenom()
				.getValue());
		lProfesseurVOGWT.setEmail((String) pProfesseurFields.getEmail()
				.getValue());
		lProfesseurVOGWT.setEnseignement((String) pProfesseurFields
				.getEnseignement().getValue());
		lProfesseurVOGWT.setId(new Long(pProfesseurFields.getId().getValue())
				.longValue());
		lProfesseurVOGWT.setLogin((String) pProfesseurFields.getLogin()
				.getValue());
		lProfesseurVOGWT.setPassword((String) pProfesseurFields.getMotdepasse()
				.getValue());
		lProfesseurVOGWT.setRole(UserRoleVOGWT.PROFESSEUR.getValue());

		final MessageBox lWaitMessageBox = MessageBox.progress("Information",
				"Modification du professeur " + lProfesseurVOGWT.getLogin(),
				"modification en cours...");
		AsyncCallback<Object> lCallback = new AsyncCallback<Object>() {
			public void onFailure(Throwable pCaught) {
				lWaitMessageBox.hide();
				MessageBox.alert("Erreur updateProfesseur", pCaught
						.getMessage(), null);
			}

			public void onSuccess(Object pResult) {
				lWaitMessageBox.hide();
				Info.display("Information", "Professeur modifié avec succès",
						"");
				ModificationWindow.closeCurrentWindow();
			}
		};
		ControlerUtil.getUserControlerServiceAsyncInstance().updateProfesseur(
				lProfesseurVOGWT, lCallback);
	}

}
